home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Freeware / Read It Later 0.9924 / read_it_later-0.9924-fx.xpi / chrome / isreaditlater.jar / content / ISRILxul.js < prev    next >
Text File  |  2008-11-02  |  27KB  |  835 lines

  1. function ISRILxul()
  2. {
  3.     this.dPrefix = 'isRitL-';
  4.     
  5.     this.sPrompt = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);    
  6.     
  7.     this.curPage = 1;
  8.     
  9.     this.keyStates = new Array();
  10.     
  11.     this.wType = 'normal';
  12.     
  13.     this.sidebarMarkWait = 2.25 * 1000;
  14. }
  15.  
  16. ISRILxul.prototype = {
  17.     
  18.     _init : function(wType) {
  19.         this.wType = !wType ? this.wType : wType;
  20.         
  21.         this.window = window;
  22.         
  23.         this.later = this.bip('later');    
  24.         this.mark1 = this.bip('mark1');
  25.         this.mark2 = this.bip('mark2');    
  26.         this.And   = this.bip('markAnd');
  27.         this.AndLinks   = this.bip('markAndLinks');
  28.         this.markAndMore   = this.bip('markAndMore');
  29.         this.AndMoreList = this.bip('markAndMoreItems');
  30.         this.List = this.bip('List');
  31.         this.ListContent = this.bip('ListContent');    
  32.         this.ListMsg = this.bip('Msg');        
  33.         this.ListBtn = this.bip('ReadSomething');    
  34.         this.Sort = this.bip('ListSort');    
  35.         this.Filter = this.bip('ListFilter');
  36.         this.Page = this.bip('ListPage');
  37.         this.PageItems = this.bip('ListPageItems');
  38.         this.Previous = this.bip('ListPrevious');
  39.         this.Next = this.bip('ListNext');
  40.         
  41.         if (this.wType == 'normal') {
  42.             //Move context items into place
  43.             ISRILxul.bi('contentAreaContextMenu').insertBefore(ISRILxul.bi('context-isRitL-ReadLaterLink'), ISRILxul.bi('context-bookmarklink'));
  44.             ISRILxul.bi('contentAreaContextMenu').insertBefore(ISRILxul.bi('context-isRitL-ReadLater'), ISRILxul.bi('context-bookmarkpage'));
  45.             
  46.             ISRILxul.bi('context_bookmarkAllTabs').parentNode.insertBefore(ISRILxul.bi('context-isRitL-SaveAllTabs'), ISRILxul.bi('context_bookmarkAllTabs'));
  47.             
  48.             ISRILxul.bi("contentAreaContextMenu").addEventListener("popupshowing", ISRILxul.contextPopupShowing, false);
  49.         }
  50.     },
  51.     _init_finish : function() {        
  52.         ISRILxul.ShowCount();            
  53.         ISRILxul.UseClickToSaveStatusBar();
  54.         if ( ISRILxul.bip('ReadSomething')) {
  55.             ISRILxul.bip('ReadSomething').onclick = ISRILxul.SetButtonTarget;
  56.         }
  57.     },
  58.     
  59.     bi : function(id) {
  60.         return ( (this.doc)?(this.doc):(document) ).getElementById(id);
  61.     },
  62.     bip : function(id) {
  63.         return this.bi(this.dPrefix + id);
  64.     },
  65.     changeDoc : function(doc, win) {
  66.         ISRILxul.doc = doc;
  67.         win.addEventListener("unload", function() { ISRILxul.doc = null; }, false);
  68.     },
  69.     
  70.     // --- //
  71.     
  72.     contextPopupShowing : function() {
  73.         if (ISRILprefs.prefB('context-menu')) {
  74.             if ( (gContextMenu.onSaveableLink || ( gContextMenu.inDirList && gContextMenu.onLink )) ) {
  75.                 gContextMenu.showItem("context-isRitL-ReadLaterLink", true);
  76.                 gContextMenu.showItem("context-isRitL-ReadLater", false);
  77.             } else if (gContextMenu.isTextSelected) {
  78.                 gContextMenu.showItem("context-isRitL-ReadLaterLink", false);
  79.                 gContextMenu.showItem("context-isRitL-ReadLater", false);    
  80.             } else {
  81.                 gContextMenu.showItem("context-isRitL-ReadLaterLink", false);
  82.                 gContextMenu.showItem("context-isRitL-ReadLater", true);    
  83.             }
  84.         } else {
  85.             gContextMenu.showItem("context-isRitL-ReadLaterLink", false);
  86.             gContextMenu.showItem("context-isRitL-ReadLater", false);    
  87.         }
  88.     },
  89.     
  90.     // --- //
  91.     
  92.     IconHover : function() {
  93.         ISRILxul.mark1.className = ISRILxul.dPrefix + 'hover';
  94.         ISRILxul.mark2.className = ISRILxul.dPrefix + 'hover';
  95.     },
  96.     IconHoverOff : function() {
  97.         ISRILxul.mark1.className = '';
  98.         ISRILxul.mark2.className = '';            
  99.     },
  100.     
  101.     // --- //
  102.     
  103.     SetBtn : function(t) {
  104.         var l;
  105.         var m1;
  106.         var m2;
  107.         
  108.         switch(t) {
  109.             case(1): 
  110.                 l=false;
  111.                 m1=true;
  112.                 m2=true;
  113.                 ISRIL.lastURL = ISRIL.url();
  114.                 break;
  115.             case(2): 
  116.                 l=true;
  117.                 m1=false;
  118.                 m2=false;
  119.                 if (ISRIL.url() != ISRIL.lastURL) {
  120.                     ISRIL.autoMarkTO = setTimeout('ISRIL.autoMark()', ISRIL.autoMarkWait * 1000);
  121.                 }
  122.                 break;
  123.             default:
  124.                 l=true;
  125.                 m1=true;
  126.                 m2=true;                
  127.         }
  128.         if (ISRILxul.bip('later')) { ISRILxul.bip('later').hidden = l; }
  129.         if (ISRILxul.bip('mark1')) { ISRILxul.bip('mark1').hidden = m1; }
  130.         if (ISRILxul.bip('mark2')) { ISRILxul.bip('mark2').hidden = m2; }
  131.     },
  132.     
  133.     MarkAsReadAnd : function() {
  134.         ISRILxul.And.setAttribute('hidden', false);
  135.         ISRILxul.And.openPopup(ISRILxul.mark2, "after_end", -1, -1);
  136.         ISRILxul.And.setAttribute('forcestyle', ISRILprefs.pref('force-styles'));
  137.         
  138.         ISRILxul.ClearMenu( ISRILxul.AndLinks );
  139.         ISRILxul.ClearMenu( ISRILxul.AndMoreList );
  140.         
  141.         prefsites = ISRILprefs.pref('sites').split(',');
  142.         prefsites.shift();
  143.         for(var i=0; i<prefsites.length; i++) {
  144.             var newLabel = document.createElement('label');
  145.             newLabel.className = 'text-link';
  146.             newLabel.setAttribute('onclick', 'ISRIL.bookmark('+prefsites[i]+'); ISRIL.MarkAsRead(null, null, "'+prefsites[i]+'"); ISRILxul.closeAnd();');
  147.             newLabel.setAttribute('value', ISRIL.l('addTo') + ' ' + ISRIL_sites[ prefsites[i] ][0]);
  148.             ISRILxul.AndLinks.appendChild( newLabel );
  149.         }
  150.         
  151.         for(i in ISRIL_sites) {
  152.             var newItem = document.createElement('menuitem');
  153.             newItem.setAttribute('label', ISRIL_sites[ i ][0]);
  154.             newItem.setAttribute('i', i);
  155.             ISRILxul.AndMoreList.appendChild( newItem );
  156.         }        
  157.     },
  158.     
  159.     closeAnd : function() {
  160.         ISRILxul.And.setAttribute('hidden', true);    
  161.     },
  162.     
  163.     ClearMenu : function(menu, cls) {
  164.         for(var i=menu.childNodes.length - 1; i >= 0; i--) {
  165.             if (!cls || (cls &&  menu.childNodes[i].className == cls)) {
  166.                 menu.removeChild(menu.childNodes.item(i));
  167.             }
  168.         }    
  169.     },
  170.     
  171.     ListStatus : function() {
  172.         return (ISRILxul.window.ISRILxul.bi('sidebar').contentWindow.location.href == "chrome://isreaditlater/content/isreaditlaterlist.xul" || (ISRILxul.List.state!='closed' && ISRILxul.List.state!='hiding'));                
  173.     },
  174.     
  175.     ToggleReadingList : function() {
  176.         if ( ISRILxul.justClosed ) { return false; }
  177.         ( (ISRILxul.List.state=='closed' || ISRILxul.List.state=='hiding') ? (ISRILxul.OpenReadingList()):(ISRILxul.CloseReadingList()) );
  178.     },
  179.     
  180.     OpenReadingList : function(forceOpen) {        
  181.         ISRILxul.List.className = '';
  182.         
  183.         if (ISRILxul.List.tagName == 'panel' && ISRILprefs.pref('list-place') == 'btn') {
  184.             ISRILxul.List.setAttribute('hidden', false);
  185.             ISRILxul.List.openPopup( ((ISRILxul.bip('ReadSomething'))?(ISRILxul.bip('ReadSomething')):(ISRILxul.bi('urlbar-container'))) , "after_end", -1, -1);        
  186.             ISRILxul.bip('ListGrid').setAttribute('flex', (ISRILprefs.pref('list-type') == 'scroll') ? 2 : 0);
  187.         } else if (ISRILxul.wType == 'normal') {
  188.             toggleSidebar('isRitL-sidebarlist', forceOpen);
  189.             if ( ISRILxul.getSidebarWidth() < 300) { ISRILxul.setSidebarWidth(300) }
  190.             return true;
  191.         }
  192.         
  193.         ISRILxul.List.className += (ISRILprefs.pref('list-view') == 'cond') ? ' isRitL-cond' : '';
  194.         ISRILxul.List.className += (ISRILprefs.pref('list-type') == 'scroll') ? ' isRitL-scroll' : '';
  195.         ISRILxul.List.setAttribute('forcestyle', ISRILprefs.pref('force-styles'));
  196.         
  197.  
  198.         // --  Default Options -- //
  199.         sortOpts = {11:0,12:1,1:2,5:3,pr:4};
  200.         ISRILxul.Sort.selectedIndex = sortOpts[ ISRILprefs.pref('default-sort') ];        
  201.         ISRILxul.Filter.value = ISRILglobals.filter;
  202.         
  203.         // --  Output List -- //    
  204.         ISRILxul.FillList();    
  205.         
  206.         
  207.         ISRILxul.bip('RL-FeedLink').hidden = ( (ISRILprefs.prefB('feed')) ? (false):(true) );
  208.         ISRILxul.bip('RL-Sync').hidden = ( (ISRILprefs.prefB('sync')) ? (false):(true) );
  209.         ISRILxul.bip('RL-SetupSync').hidden = ( (ISRILprefs.prefB('sync')) ? (true):(false) );
  210.         
  211.         // --  Page Counter -- //
  212.         ISRILxul.updatePageCounter();
  213.         
  214.         // --- Detecting Ctrl/Shift/Command Click --- //
  215.         if (navigator.platform != 'Win32') {
  216.             window.addEventListener("keydown", ISRILxul.KeyDown, false);
  217.             window.addEventListener("keyup", ISRILxul.KeyUp, false);
  218.             ISRILxul.keyStates = new Array();
  219.         }
  220.         
  221.     },
  222.     
  223.     updatePageCounter : function() {
  224.         ISRILxul.UpdateCurrentPage();
  225.         ISRILxul.fillSelect( ISRILxul.bip('ListPage') , 1, ISRILxul.totalPages, ISRILxul.curPage);
  226.     },
  227.     
  228.     UpdateCurrentPage : function() {
  229.         ISRILxul.totalPages = Math.ceil(ISRILglobals.ListFilteredSize/ISRILxul.PerPage());
  230.         ISRILxul.curPage = ISRILxul.curPage < ISRILxul.totalPages ? ISRILxul.curPage : ISRILxul.totalPages;
  231.         ISRILxul.curPage = ISRILxul.curPage > 0 ? ISRILxul.curPage : 1;
  232.         return ISRILxul.curPage;
  233.     },
  234.     
  235.     PerPage : function() {
  236.         return ISRILprefs.pref('list-page') * 1 >= 4 ? ISRILprefs.pref('list-page') : 4;        
  237.     },
  238.     
  239.     setDefaultSort : function() {
  240.         ISRILprefs.setPref('default-sort', ISRILxul.Sort.selectedItem.getAttribute('value'));
  241.     },    
  242.     
  243.     FillList : function(reuse, Refresh) {        
  244.         if (ISRILglobals.listShowErrorOnOpen) {
  245.             ISRILglobals.listShowErrorOnOpen.onCancel = ISRILxul.FillList;
  246.             return ISRILxul.ListErrorSet(true, ISRILglobals.listShowErrorOnOpen);
  247.         }    
  248.         
  249.         if (Refresh) { ISRILxul.curPage = 1; ISRILxul.bip('ListPage').selectedIndex = 0; }
  250.         
  251.         //Additional Sorting
  252.         var sort = ISRILxul.bip('ListSort') ? ISRILxul.bip('ListSort').selectedItem.getAttribute('value') : false;
  253.         switch( sort ) {
  254.             case('pr'):
  255.                 return ISRILpr.start();
  256.                 break;
  257.             default:
  258.                 ISRILpr.xul.MsgPostRankAsk(false);
  259.         }
  260.         ISRILglobals.filter = ISRILxul.bip('ListFilter').value;
  261.         ISRILxul.PopulateList( ISRIL.GetList( sort, ISRILxul.bip('ListFilter').value, ((!reuse)?(false):(true)) ) );
  262.     },
  263.     
  264.     PopulateList : function( l ) {
  265.         ISRILxul.ClearMenu(ISRILxul.ListContent);
  266.         ISRILxul.ShowJustList();        
  267.         ISRILxul.UpdateCurrentPage();
  268.         
  269.         if (ISRILprefs.pref('list-type')=='pages') {
  270.             perPage = ISRILxul.PerPage();
  271.             start = (ISRILxul.curPage-1) * perPage;
  272.             end = start + perPage * 1;
  273.         } else {
  274.             start = 0;
  275.             end = ISRILglobals.ListFilteredSize;
  276.         }
  277.         //alert( start + ' | ' + end)
  278.         var daysAgo = (ISRILprefs.pref('list-view')=='cond')?( ISRIL.l('daysAgoShort') ):( ISRIL.l('daysAgo') );
  279.         
  280.         d = new Date();
  281.         ISRILxul.totalList = 0;
  282.         
  283.         for(i in l) {
  284.             if (ISRILxul.totalList >= start && ISRILxul.totalList < end) {
  285.                 days = Math.round( (d.getTime() - l[i].dateAdded/1000) / 1000 / 60 / 60 / 24);
  286.                 nsURI = ISRIL.uri(l[i].uri);
  287.                 if (nsURI.scheme != 'about') {
  288.                     
  289.                     rowClass =  ISRILxul.dPrefix+'ListRow ';
  290.                     rowClass += ( (ISRIL.listDrops[l[i].itemId])?(ISRILxul.dPrefix+'dim'):('') ); //If pending to be marked as read
  291.                     rowClass += ( (!navigator.onLine && !ISRILoffline.getF(l[i].itemId).exists())?(ISRILxul.dPrefix+'notoffline'):('') ); //If offline and item is not saved for offline viewing
  292.                     
  293.                     domain = nsURI.host.replace('www.','');
  294.                     
  295.                     // -- Create Row -- //
  296.                     row = ISRILxul.createNode('row',
  297.                             {
  298.                                 id            :    ISRILxul.dPrefix+'Item_'+l[i].itemId,
  299.                                 align            :    'center',
  300.                                 class            :    rowClass,
  301.                                 style            :    "background-image:url('"+ISRIL.sIcon.getFaviconImageForPage(nsURI).spec+"')"
  302.                             } );
  303.                         
  304.  
  305.                         //Title - Domain
  306.                         colT = ISRILxul.createNode('vbox', {flex:2});
  307.                             Title = ISRILxul.createNode('label', 
  308.                                     {
  309.                                         crop        :    'end',
  310.                                         value        :    (l[i].title.length > 0)?l[i].title:nsURI.spec,
  311.                                         tooltiptext    :    l[i].title,
  312.                                         class        :    ISRILxul.dPrefix+'ListItem',
  313.                                         uri        :    l[i].uri,
  314.                                         context        :    ISRILxul.dPrefix+"list-context"
  315.                                     } );
  316.                             Title.onclick = ISRILxul.ListItemClick;
  317.                             Title.onmouseover = ISRILxul.ListItemInStatusBar;
  318.                             
  319.                             Domain = ISRILxul.createNode('label', 
  320.                                     {
  321.                                         crop        :    'end',
  322.                                         value        :    domain,
  323.                                         class        :    'isRitL-ListDomain',
  324.                                         uri        :    'http://'+domain,
  325.                                         onclick        :    "ISRIL.GoTo('"+domain+"');ISRILxul.CloseReadingList();"
  326.                                     } );
  327.                             Domain.onmouseover = ISRILxul.ListItemInStatusBar;
  328.                             
  329.                         //List Mark
  330.                         Mark = ISRILxul.createNode('label', 
  331.                                     {
  332.                                         value        :    '',
  333.                                         class        :    'isRitL-ListMark',
  334.                                         tooltiptext    :    ISRIL.l('MarkAsRead'),
  335.                                         onclick        :    "ISRILxul.MarkAsReadItem('"+l[i].itemId+"', this);"
  336.                                     } );
  337.                         
  338.                         if ( l[i].postrank) {                            
  339.                             //Postrank
  340.                             Info = ISRILxul.createNode('label', 
  341.                                         {
  342.                                             align        :    'center',
  343.                                             value        :    l[i].postrank,
  344.                                             style        :    'background-color:'+l[i].postrank_color,
  345.                                             class        :    ISRILxul.dPrefix+'PostRank'
  346.                                         } );
  347.                             Info.onclick = function() {
  348.                                 ISRIL.GoTo('http://postrank.com', null, null, 'http://readitlaterlist.com');
  349.                             }
  350.                         } else {
  351.                             //Age
  352.                             Info = ISRILxul.createNode('label', 
  353.                                         {
  354.                                             align        :    'center',
  355.                                             value        :    (days>0) ? (days + ' ' + daysAgo) : ISRIL.l('today') ,
  356.                                             class        :    ISRILxul.dPrefix+'ListAge'
  357.                                         } );
  358.                         }
  359.                         
  360.                     row.appendChild(colT);
  361.                         colT.appendChild(Title);
  362.                         colT.appendChild(Domain);
  363.                     row.appendChild(Mark);
  364.                     row.appendChild(Info);
  365.                     ISRILxul.ListContent.appendChild(row);
  366.                 }
  367.             }
  368.             ISRILxul.totalList++;
  369.         }    
  370.         
  371.         ISRILxul.updatePageCounter();
  372.         ISRILxul.Previous.className = ((ISRILxul.curPage == 1)?('isRitL-dim'):('text-link'));
  373.         ISRILxul.Next.className = ((ISRILxul.TotalPages() == 0 || ISRILxul.curPage == ISRILxul.TotalPages())?('isRitL-dim'):('text-link'));
  374.         
  375.         ISRILxul.ShowList();
  376.     },
  377.     
  378.     ListItemInStatusBar : function(e) {
  379.         ISRILxul.window.ISRILxul.bi('statusbar-display').label = this.getAttribute('uri');        
  380.     },
  381.     
  382.     ListItemClick : function(e) {
  383.         var click = ISRILxul.ClickTarget(e, 'open');
  384.         
  385.         if (click.targ) {
  386.             ISRIL.GoTo(this.getAttribute('uri'), false, click.targ);
  387.             if (click.targ != 'tab') {
  388.                 ISRILxul.CloseReadingList();
  389.             }
  390.         }
  391.     },
  392.     
  393.     SetButtonTarget : function(e) {
  394.         ISRILxul.ButtonTarget = ISRILxul.ClickTarget(e, 'open');
  395.         if (ISRILxul.ButtonTarget.which == 2) {
  396.             ISRIL.Read();
  397.         }
  398.     },
  399.     
  400.     ClickTarget : function(e, defaultPref) {
  401.         var targ;
  402.         if (e.which != 3) {
  403.             if (e.which == 1) {
  404.                 if (e.ctrlKey || ISRILxul.keyStates[224]) {//224
  405.                     targ = 'tab';
  406.                     ISRILxul.keyStates[ 17 ] = false; //FF doesn't run keyup event when clicking
  407.                 } else if (e.shiftKey || ISRILxul.keyStates[16]) {
  408.                     targ = 'window';
  409.                     ISRILxul.keyStates[ 16 ] = false; //FF doesn't run keyup event when clicking
  410.                 } else if (defaultPref) {
  411.                     targ = ISRILprefs.pref(defaultPref);
  412.                 }
  413.             } else if (e.which == 2) {
  414.                 targ = 'tab';    
  415.             }
  416.         }
  417.         return {targ:targ,which:e.which};
  418.     },    
  419.     
  420.     ShowCount : function(allWindows) {
  421.         if (allWindows) {
  422.             //Cycle through windows to update    
  423.             var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  424.                                .getService(Components.interfaces.nsIWindowMediator);
  425.             var enumerator = wm.getEnumerator('navigator:browser');
  426.             while(enumerator.hasMoreElements()) {
  427.                 var win = enumerator.getNext();
  428.                 if (win.ISRILxul.bip('ReadSomething')) {
  429.                     ISRILxul.ShowCountToggle( win.ISRILxul.bip('ReadSomething') );
  430.                 }
  431.             }
  432.         } else if (ISRILxul.bip('ReadSomething')) {
  433.             ISRILxul.ShowCountToggle( ISRILxul.bip('ReadSomething') );    
  434.         }
  435.     },
  436.     ShowCountToggle : function( obj ) {
  437.         if (obj) {
  438.             obj.className = ( (ISRILprefs.prefB('show-count')) ? ('isRitL-showCount'):('') );        
  439.         }
  440.     },
  441.     
  442.     UpdateUnreadCounter : function() {
  443.         if (ISRILxul.bip('ReadSomething')) {
  444.             ISRILxul.bip('ReadSomething').setAttribute('unread', ISRILglobals.ListSize);
  445.         }
  446.     },
  447.     
  448.     UpdateViews : function() {
  449.         //If sidebar is open, reload list to show changes that we are about to send
  450.         if (ISRILxul.bi("sidebar") && ISRILxul.bi("sidebar").contentWindow.location.href == "chrome://isreaditlater/content/isreaditlaterlist.xul") {
  451.             ISRILxul.bi("sidebar").contentWindow.ISRILxul.FillList(true, true, true);
  452.         }        
  453.     },
  454.     
  455.     KeyDown : function(e) {
  456.         ISRILxul.keyStates[ e.keyCode ] = true;
  457.     },
  458.     KeyUp : function(e) {
  459.         ISRILxul.keyStates[ e.keyCode ] = false;        
  460.     },
  461.     
  462.     ListItemContextSet : function() {
  463.         ISRILxul.bip('item-tab').setAttribute('uri', document.popupNode.getAttribute('uri') );
  464.         ISRILxul.bip('item-window').setAttribute('uri', document.popupNode.getAttribute('uri') );    
  465.     },
  466.     
  467.     ListItemContextClick : function(obj, targ) {
  468.         ISRIL.GoTo(obj.getAttribute('uri'), false, targ);
  469.         ISRILxul.CloseReadingList();
  470.     },
  471.     
  472.     CloseReadingList : function() {
  473.         if (ISRILxul.List.tagName == 'panel') {
  474.             ISRILxul.List.hidePopup();
  475.         }
  476.         if (navigator.platform != 'Win32') {
  477.             window.removeEventListener("keydown", ISRILxul.KeyDown, false);
  478.             window.removeEventListener("keyup", ISRILxul.KeyUp, false);
  479.         }
  480.     },
  481.     
  482.     ListClosed : function() {
  483.         var itemsRead = false;
  484.         ISRILxul.RunListDrops();
  485.         if (itemsRead) {
  486.             ISRILxul.curPage = 1;    //clear page user is on
  487.         }
  488.         
  489.         ISRILxul.justClosed = true;
  490.         ISRILxul.justClosedTO = setTimeout('ISRILxul.justClosed=false',100);
  491.     },
  492.     
  493.     RunListDrops : function(hideItems) {            
  494.         ISRIL._func = ISRILxul.RunListDropsBatch;
  495.         ISRIL._args = arguments;    
  496.         ISRIL.sBookmarks.runInBatchMode(ISRIL, null);
  497.     },
  498.     
  499.     RunListDropsBatch : function(hideItems) {    
  500.         for(id in ISRIL.listDrops) {
  501.             if (ISRIL.listDrops[id]) {
  502.                 ISRIL.MarkAsRead( id, true );
  503.                 itemsRead = true;
  504.                 if (hideItems && ISRILxul.bip('Item_'+id)) {
  505.                     ISRILxul.bip('Item_'+id).hidden = true;
  506.                 }
  507.             }
  508.         }
  509.         ISRIL.listDrops = new Array(); //clear items to remove        
  510.     },
  511.     
  512.     // -- //
  513.     
  514.     SidebarEvent : function() {
  515.         if (ISRILxul.bi('sidebar').contentWindow.location.href == "chrome://isreaditlater/content/isreaditlaterlist.xul") {
  516.             ISRILxul.RunListDrops();
  517.         }        
  518.     },
  519.     
  520.     // --- //
  521.     
  522.     ShowList : function() {
  523.         if (ISRILglobals.ListSize == 0) {
  524.             ISRILxul.bip('Empty').hidden = false;
  525.             ISRILxul.bip('ListContent').hidden = true;
  526.             ISRILxul.bip('ListFooter').hidden = true;
  527.             ISRILxul.bip('ListOpts').hidden = true;
  528.             ISRILxul.bip('show_hotkey_toggle').value = '(' + ISRIL.l('shortcut') + ': '+ISRIL.hotkeyText('toggle')+')';
  529.             ISRILxul.bip('show_hotkey_click_mode').value = '(' + ISRIL.l('shortcut') + ': '+ISRIL.hotkeyText('click_mode')+')';
  530.         } else {
  531.             
  532.             if (ISRILglobals.ListFilteredSize == 0 && !ISRILxul.bip('nofiltermatch')) {                
  533.                 var node = ISRILxul.createNode('label', {id:'isRitL-nofiltermatch', align:'center',style:'text-align:center'});
  534.                 ISRILxul.ListContent.appendChild( node );
  535.                 node.textContent = ISRIL.l('NoFilterMatch');    
  536.             }
  537.             ISRILxul.bip('Empty').hidden = true;
  538.             ISRILxul.bip('ListContent').hidden = false;
  539.             ISRILxul.bip('ListFooter').hidden = false;    
  540.             ISRILxul.bip('ListOpts').hidden = false;
  541.         }            
  542.     },
  543.     
  544.     ShowJustList : function() {
  545.         ISRILxul.ListMsgSet(false);
  546.         ISRILxul.ListErrorSet(false);
  547.         ISRILxul.ListNotifySet('Sync', false);
  548.         ISRILglobals.ViewedError = true;
  549.     },
  550.     
  551.     ListNotifySet : function(id, status, noTO) {
  552.         this.bip('Notify-'+id).hidden = !status;
  553.         if (!noTO && status) {
  554.             clearTimeout(this.notifyTO);
  555.             this.notifyTO = setTimeout('ISRILxul.ListNotifySet(\'' + id + '\', false)', 6500);            
  556.         }
  557.     },
  558.     
  559.     ListMsgSet : function(show, lId) {
  560.         if (show) {
  561.             ISRILxul.ListErrorSet(false);
  562.             this.ListContent.hidden = true;
  563.             this.ListMsg.hidden = false;
  564.             this.bip('Error').hidden = true;
  565.             this.bip('MsgTxt').value = ISRIL.l(lId) + '...';
  566.         } else {
  567.             this.ListContent.hidden = false;
  568.             this.ListMsg.hidden = true;    
  569.         }
  570.     },
  571.     
  572.     MsgPostRankAsk : function(show) { 
  573.         if (show) {
  574.             this.bip('ListGrid').hidden = true;
  575.             this.bip('ListMsg-pr').hidden = false;
  576.         } else {
  577.             this.bip('ListGrid').hidden = false;
  578.             this.bip('ListMsg-pr').hidden = true;            
  579.         }
  580.     },
  581.     
  582.     
  583.     ListErrorSet : function(show, a) {
  584.         if (show) {
  585.             if (this.ListStatus()) {
  586.                 this.ListMsgSet(false);
  587.                 this.ListContent.hidden = true;
  588.                 this.bip('Empty').hidden = true;
  589.                 this.bip('ListFooter').hidden = a.hideAll;
  590.                 this.bip('List-Top').hidden = a.hideAll;
  591.                 
  592.                 this.bip('Error').hidden = false;
  593.                 this.bip('ErrorTxt').firstChild.nodeValue = a.txt;
  594.                 
  595.                 if (a.txt2) {
  596.                     this.bip('ErrorTxt-2').firstChild.nodeValue = a.txt2;
  597.                 } else { this.bip('ErrorTxt-2').hidden = true; }
  598.                 
  599.                 this.bip('ErrorBtn').label = a.buttonTxt?a.buttonTxt:ISRIL.l('TryAgain');
  600.                 
  601.                 if (typeof a.onclk == 'string') {
  602.                     this.bip('ErrorBtn').setAttribute('oncommand', a.onclk);                
  603.                 } else {
  604.                     this.bip('ErrorBtn').onclick = a.onclk;
  605.                 }
  606.                 
  607.                 this.bip('ErrorCancel').hidden = a.noCancel;
  608.                 if (!a.noCancel) {
  609.                     a.onCanel = a.onCancel!=null?a.onCancel:function() { ISRILxul.ListErrorSet(false); };
  610.                     
  611.                     if (typeof a.onCancel == 'string') {
  612.                         this.bip('ErrorCancel').setAttribute('oncommand', a.onCancel);                
  613.                     } else {
  614.                         this.bip('ErrorCancel').onclick = a.onclk;
  615.                     }
  616.                 }            
  617.             
  618.                 this.ErrorOnBtn(false);
  619.             } else {
  620.                 ISRILglobals.listShowErrorOnOpen = a;            
  621.                 this.ErrorOnBtn(true);            
  622.             }
  623.             
  624.         } else {
  625.             this.ShowList();
  626.             this.bip('Error').hidden = true;
  627.             this.ErrorOnBtn(false);
  628.         }
  629.     },
  630.     
  631.     ErrorOnBtn : function(show) {
  632.         if (this.window.ISRILxul.ListBtn) {
  633.             var cl = ' isRitL-Warn';
  634.             if (show && !this.window.ISRILxul.ListBtn.className.match(cl)) {
  635.                 this.window.ISRILxul.ListBtn.className += cl;
  636.             } else {
  637.                 this.window.ISRILxul.ListBtn.className = this.window.ISRILxul.ListBtn.className.replace(cl, '');
  638.                 ISRILglobals.listShowErrorOnOpen = false;
  639.             }
  640.         }
  641.     },
  642.     
  643.     
  644.     
  645.     // --- //
  646.     
  647.     
  648.     MarkAsReadItem : function(id, chkmrk) {
  649.         row = ISRILxul.bi(ISRILxul.dPrefix+'Item_'+id);
  650.         if (!row.className.match(' isRitL-dim') ) {
  651.             ISRIL.listDrops[id] = true;
  652.             row.className += ' isRitL-dim';        
  653.             chkmrk.setAttribute('tooltiptext', ISRIL.l('MarkAsReadCancel'));
  654.         } else {
  655.             ISRIL.listDrops[id] = false;
  656.             row.className = row.className.replace(' isRitL-dim', '');
  657.             chkmrk.setAttribute('tooltiptext', ISRIL.l('MarkAsRead'));
  658.         }
  659.         if (ISRILxul.wType=='sidebar') {
  660.             clearTimeout(ISRILxul.mrTO);
  661.             ISRILxul.mrTO = setTimeout('ISRILxul.RunListDrops(true);', ISRILxul.sidebarMarkWait);
  662.         }
  663.     },
  664.     
  665.     PageMove : function(n) {
  666.         if (n == 0) {
  667.             ISRILxul.curPage = ISRILxul.Page.selectedIndex + 1;
  668.         } else {
  669.             ISRILxul.curPage += n;
  670.             totalpages = ISRILxul.TotalPages();
  671.             
  672.             // -- Cases -- //
  673.             if (ISRILxul.curPage < 1) { ISRILxul.curPage = 1; }
  674.             if (ISRILxul.curPage > totalpages) { ISRILxul.curPage = totalpages; }
  675.         }
  676.         
  677.         ISRILxul.Page.selectedIndex = ISRILxul.curPage-1;
  678.         ISRILxul.FillList(true);
  679.     },
  680.     
  681.     TotalPages : function() {
  682.         return Math.ceil(ISRILxul.totalList/ISRILxul.PerPage());    
  683.     },
  684.     
  685.     // --- //
  686.     
  687.     SetClickToSaveStatusBar : function(status) {
  688.         ISRILprefs.setPref('clicktosaveinbar', status);
  689.         ISRILxul.UseClickToSaveStatusBar();
  690.     },
  691.     UseClickToSaveStatusBar : function() {
  692.         if ( ISRILxul.bip('ClickToSaveButton') ) {
  693.             ISRILxul.bip('ClickToSaveButton').hidden = ((!ISRILprefs.prefB('clicktosaveinbar'))?(true):(false));
  694.         }
  695.     },
  696.     
  697.     // --- //
  698.         
  699.     OpenOffline : function() {
  700.         ISRILxul.window.openDialog("chrome://isreaditlater/content/offline.xul", "", "chrome,titlebar,toolbar,centerscreen,modal");
  701.     },
  702.     
  703.     // --- //
  704.     
  705.     OpenOptions : function(tab) { 
  706.         ISRILxul.window.openDialog("chrome://isreaditlater/content/options.xul", "", "chrome,titlebar,toolbar,centerscreen,modal", tab);
  707.     },
  708.     
  709.     // --- //
  710.     
  711.     OpenAnywhere : function() {
  712.         if ( ISRILprefs.prefB('feed') && ISRILprefs.prefB('sync') && !ISRILprefs.prefB('online-access-prompt')) {
  713.             ISRIL.online('unread');            
  714.         } else {
  715.             ISRILxul.window.openDialog("chrome://isreaditlater/content/anywhere.xul", "", "chrome,titlebar,toolbar,centerscreen,modal");
  716.         }
  717.     },
  718.     
  719.     // -- //
  720.     
  721.     NotSavedOffline : function() {
  722.         msg     = ISRIL.l('NotSavedOffline');
  723.         name    = 'NotSavedOffline';
  724.         icon    = 'chrome://isreaditlater/skin/offline16.png';
  725.         buttons = [{
  726.                     label:  ISRIL.l('Hide'),
  727.                     popup: null,
  728.                     callback: ISRIL.RemoveNotify,
  729.                     }];
  730.         
  731.         ISRIL.GetNotify(name, msg, icon, buttons);
  732.     },
  733.     
  734.     // -- //
  735.         
  736.     maxPageN : function(lt) {
  737.         lt = (!lt) ? ISRILprefs.pref('list-view') : lt;
  738.         var rowHeight = (lt == 'normal') ? 41 : 18;
  739.         var maxRows = Math.floor( screen.height * 0.5 / rowHeight );
  740.         return (maxRows > 0) ? maxRows : ISRILprefs.pref('list-page') * 1;
  741.     },
  742.     
  743.     // -- //
  744.     
  745.     recentWindow : function() {
  746.         return Components.classes["@mozilla.org/appshell/window-mediator;1"]
  747.                    .getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser");
  748.     },
  749.     
  750.     getSidebarWidth : function (w) {
  751.         return window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  752.             .getInterface(Components.interfaces.nsIWebNavigation)
  753.             .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
  754.             .rootTreeItem
  755.             .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  756.             .getInterface(Components.interfaces.nsIDOMWindow).document.getElementById("sidebar-box").width;
  757.        },
  758.     
  759.     setSidebarWidth : function (w) {
  760.         window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  761.             .getInterface(Components.interfaces.nsIWebNavigation)
  762.             .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
  763.             .rootTreeItem
  764.             .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  765.             .getInterface(Components.interfaces.nsIDOMWindow).document.getElementById("sidebar-box").width=w;
  766.        },
  767.     
  768.     // --- //
  769.     
  770.     fillSelect : function(obj, min, max, selected) {
  771.         selected = selected?selected-min:0;
  772.         obj.removeAllItems();
  773.         for(i=min; i<=max; i++) {
  774.             obj.insertItemAt(i - 1, i, i);
  775.         }
  776.         obj.setAttribute('min', min);
  777.         obj.selectedIndex = (selected > max - 1) ? (max - 1) : selected;
  778.     },
  779.     
  780.     // --- //
  781.     
  782.     createNode : function (ty, attributes) {
  783.         node = document.createElement(ty);
  784.         for(ik in attributes) {
  785.             switch(ik) {
  786.                 case('class'):
  787.                     node.className = attributes[ik];
  788.                     break;
  789.                 case('style'):
  790.                     if (typeof attributes[ik] == 'string') {
  791.                         node.setAttribute('style', attributes[ik]);
  792.                     } else {
  793.                         its = attributes[ik].split(';');
  794.                         for(i=0; i<its.length; i++) {
  795.                             parts = its[i].split(':');
  796.                             node.style[parts[0]] = parts[1];
  797.                         }
  798.                     }
  799.                     break;
  800.                 case('innerHTML'):
  801.                     node.innerHTML = attributes[ik];
  802.                     break;
  803.                 case('onclick'):
  804.                     if (typeof attributes[ik] == 'string') {
  805.                         node.setAttribute('onclick', attributes[ik]);
  806.                     } else {
  807.                         node.onclick = attributes[ik]
  808.                     }
  809.                 default:
  810.                     node.setAttribute(ik, attributes[ik]);
  811.             }                
  812.         }
  813.         return node;
  814.     },
  815.     
  816.     test : function() {
  817.         var tabs = ISRILxul.bi('content').mTabs;
  818.         
  819.         for (i in tabs) { 
  820.             //doc = tabs[i].ownerDocument;
  821.             for(c in tabs[i].childNodes) {
  822.                 ISRIL.d(tabs[i].childNodes[c]);
  823.             }
  824.             //element = doc.getAnonymousElementByAttribute(tabs[i], "anonid", "close-button");
  825.         }    
  826.         
  827.     },
  828.     
  829.     removeNode : function(node) { if (node) { return node.parentNode.removeChild(node); } },
  830.     
  831.     
  832.  
  833. }
  834.  
  835. var ISRILxul = new ISRILxul();